// 设计你的循环队列实现。 循环队列是一种线性数据结构，其操作表现基于 FIFO（先进先出）原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

// 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里，一旦一个队列满了，我们就不能插入下一个元素，即使在队列前面仍有空间。但是使用循环队列，我们能使用这些空间去存储新的值。

// 你的实现应该支持如下操作：

// MyCircularQueue(k): 构造器，设置队列长度为 k 。
// Front: 从队首获取元素。如果队列为空，返回 -1 。
// Rear: 获取队尾元素。如果队列为空，返回 -1 。
// enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
// deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
// isEmpty(): 检查循环队列是否为空。
// isFull(): 检查循环队列是否已满。
class circularQueue {
  constructor (k) {
    this.list = Array(k)
    this.front = 0 // 队首指针
    this.rear = 0 // 队尾指针
    this.max = k // 队列长度
  }
  //向循环队列中插入一个元素
  enQueue (value) {
    // 如果队列已经满了
    if (this.isFull()) {
      // 插入失败
      return false
    } else {
      this.list[this.rear] = value
      // 把指针 + 1， % 因为指针到末尾后，要在重新指回到第一个
      this.rear = (this.rear + 1) % this.max
      return true
    }
  }
  deQueue () {
    if (this.isEmpty()) {
      return false
    } else {
      this.list[this.front] = ''
      this.front = (this.front + 1) % this.max
      return true
    }
    // 删除元素
  }
  // 获取队首元素
  Front () {
    if (this.isEmpty()) {
      return -1
    } else {
      return this.list[this.front]
    }
  }
  // 获取队尾元素
  Rear () {
    if (this.isEmpty()) {
      return -1
    } else {
      const rear = this.rear - 1
      const cur = rear < 0 ? this.max - 1 : rear
      return this.list[cur]
    }
  }
  // 查看队列是否为空
  isEmpty () {
    // 两个指针相同 并且 第一个元素为空
    return this.front === this.rear && !this.list[this.front]
  }
  // 查看队列是否已满
  isFull () {
    return this.front === this.rear && !!this.list[this.front]
  }
}
let CircularQueue = new circularQueue(7)
console.log(CircularQueue.enQueue(0));
console.log(CircularQueue.Front());

